

/**
 * * 设置Cookie过期时间，并返回给前端
 * @param { Context } ctx *
 */
const awaitNext = ctx => {
  if (ctx.body && ctx.body.code === 200) {
    ctx.body.Cookie = ctx.state.Cookie;
    ctx.body.CookieExp = new Date().getTime() + 1000 * 60 * 15; // 比当前时间多15分钟
  }
};

/**
 * * 因为在所有的教务系统相关请求中都涉及到账号密码检测，因此在相关请求前，先统一经过Cookie检测
 * * 当出现 “账号或密码错误”、“教务系统请求异常”等情况直接响应异常信息，不在继续进行路由匹配
 * * 当正常登入时，将已激活的Cookie值存储在ctx.state中，继续向下执行
 * @return {() => Promise} *
 */
module.exports = () => {
  return async (ctx, next) => {
    const { Cookie } = ctx.data;
    const { useOldCookie } = ctx.state;
    // console.log('Cookie', Cookie);
    if ((useOldCookie && !Cookie) || ctx.url === '/login') { // 前端未传递Cookie或请求登录接口时执行登录，获取cookie
      const { setCookie, status } = await ctx.service.login.getCookie();

      // 状态码为302时表示账号密码正确
      if (status === 302) {
        ctx.state.Cookie = setCookie;
        await next(); // 执行后续中间件
        awaitNext(ctx);
      }

      // 状态码为200时表示用户名或密码错误（目前只发现这一种情况）
      else if (status === 200) {
        ctx.body = {
          code: 401,
          msg: '用户名或密码错误',
        };
      }

      // 状态码为404时表示教务系统无法访问
      else if (status === 404) {
        ctx.body = {
          code: 500,
          msg: '系统服务器异常，请稍后再试',
        };
      }

      // 其它情况的状态码统一提示异常
      else {
        ctx.body = {
          code: 500,
          msg: '系统服务器异常，请稍后再试',
        };
      }

    } else {
      ctx.state.Cookie = Cookie;
      await next();
      awaitNext(ctx);
    }
  };
};
